package cz.vse.po1715.lode.net.obecne;

import java.nio.ByteBuffer;


/*******************************************************************************
 * Instance třídy {@code HerniUdalost} představují ...
 *
 * @author    Dominik KOSTKA
 * @version   0.00.000
 */
public class HerniUdalost implements IHerniUdalost
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
    //--------------------------------------------------
    // konstanty typů událostí
    // K_* je pro události iniciované klientem
    // S_* je pro události iniciované serverem
    // SH_* je pro hromadně vysílané události serveru

    /** požadavek na připojení k serveru */
    public static final int K_PŘIPOJENÍ = 1001;
    /** login ok */
    public static final int S_PŘIPOJENÍ_ACK_OK = 1002;
    /** login failed */
    public static final int S_PŘIPOJENÍ_ACK_FAIL = 1003;
    /** broadcast notice of a player login */
    public static final int SH_PŘIPOJENÍ = 1004;
    /** logout request */
    public static final int K_ODPOJENÍ = 1005;
    /** broadcast notice of a player logout */
    public static final int SH_ODPOJENÍ = 1006;
    /** notice of disconnect */
    public static final int S_ODPOJENÍ = 1007;

    /** request to join a game */
    public static final int K_PŘIHLÁŠENÍ_HRA = 1101;
    /** join success */
    public static final int S_PŘIHLÁŠENÍ_HRA_ACK_OK = 1102;
    /** join failure */
    public static final int S_PŘIHLÁŠENÍ_HRA_ACK_FAIL = 1103;
    /** broadcast notice that player has joined */
    public static final int SH_HRÁČ_PŘIHLÁŠEN = 1104;
    /** request to quit game */
    public static final int K_ODHLÁSIT_HRA = 1105;
    /** broadcast notice that player has quit */
    public static final int SH_HRÁČ_ODHLÁŠEN = 1106;
    /** request to get player list */
    public static final int K_GET_HRÁČI = 1107;
    /** notice of player list */
    public static final int S_GET_HRÁČI = 1108;

    /** client chat mesg */
    public static final int K_CHAT_ZPRÁVA = 1201;
    /** server broadcast chat mesg */
    public static final int SH_CHAT_ZPRÁVA = 1202;

    /** client move */
    public static final int K_UDER = 1301;
    /** umístí loď na hrací pole */
    public static final int K_UMISTI_LOD = 1304;
    /** move ok */
    public static final int S_UDER_ACK_OK = 1302;
    /** move failed */
    public static final int S_UDER_ACK_CHYBA = 1303;
    
    /** game over notice */
    public static final int S_KONEC_HRY = 1305;
    /** used internally in client */
    public static final int K_CMD_ACK = 1401;
    /** generic ok response */
    public static final int S_ACK_OK = 1402;
    /** generic fail response */
    public static final int S_ACK_FAIL = 1403;

    /** first id that a subclass should use for events */
//    public static final int SUBCLASS_FIRST_CMD_ID = 2000;
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** typ herní události */
    protected int typUdálosti;

    /** playerID that sent the zpráva (for client mesgs) */
    protected String idHráč;

    /** player's session id */
    protected String idRelace;

    /** gameID that the event belongs to, if any */
    protected int idHry = -1;

    /** názevHry that the event belongs to */
    protected String  názevHry;

    /** # of příjemci */
    protected int početPříjemců;

    /** array of event recipient playerIDs */
    protected String[] příjemci;

    /** chat zpráva or other command specific string */
    protected String zpráva;
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    public HerniUdalost()
    {
        this(0);
    }

    /**
     * constructor that takes typUdálosti
     */
    public HerniUdalost(int typUdálosti) {
	this(typUdálosti, null);
    }

    /**
     * constructor that takes typUdálosti and zpráva
     */
    public HerniUdalost(int typUdálosti, String zpráva){
	this.typUdálosti = typUdálosti;
	this.zpráva = zpráva;
    }

//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    @Override
    public int getTyp() {
        return typUdálosti;
    }

    @Override
    public void setTyp(int typUdálosti) {
        this.typUdálosti = typUdálosti;
    }

    @Override
    public String getNázevHry() {
        return názevHry;
    }

    @Override
    public void setNázevHry(String názevHry) {
        this.názevHry = názevHry;
    }

    @Override
    public String getZprava() {
        return zpráva;
    }

    @Override
    public void setZprava(String zpráva) {
        this.zpráva = zpráva;
    }

    @Override
    public String getIdHrac() {
        return idHráč;
    }

    @Override
    public void setIdHráče(String idHráče) {
        this.idHráč = idHráče;
    }

    @Override
    public String getIdRelace() {
        return idRelace;
    }

    @Override
    public void setIdRelace(String idRelace) {
        this.idRelace = idRelace;
    }

    @Override
    public String[] getPříjemci() {
        return příjemci;
    }

    @Override
    public void setPříjemci(String[] příjemci) {
        this.příjemci = příjemci;
	početPříjemců = příjemci.length;
    }

//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /**
     * read the event from the given ByteBuffer
     */
    @Override
    public void načti(ByteBuffer zdroj) {
        typUdálosti = zdroj.getInt();
	idHráč = NIOUtils.getStr(zdroj);
	idRelace = NIOUtils.getStr(zdroj);
	idHry = zdroj.getInt();
	názevHry = NIOUtils.getStr(zdroj);
	početPříjemců = zdroj.getInt();
	příjemci = new String[početPříjemců];
	for (int i=0;i<početPříjemců;i++)
	    příjemci[i] = NIOUtils.getStr(zdroj);
	zpráva = NIOUtils.getStr(zdroj);
    }

    /**
     * write the event to the given ByteBuffer
     */
    @Override
    public int zapiš(ByteBuffer cíl) {
        int pozice = cíl.position();

	cíl.putInt(typUdálosti);
	NIOUtils.zapišString(cíl, idHráč);
	NIOUtils.zapišString(cíl, idRelace);
	cíl.putInt(idHry);
	NIOUtils.zapišString(cíl, názevHry);
	cíl.putInt(početPříjemců);
	for (int i=0;i<početPříjemců;i++)
	    NIOUtils.zapišString(cíl, příjemci[i]);
	NIOUtils.zapišString(cíl, zpráva);

        // return the length of the event, this will get inserted at the beginning of the buffer
	// in the EventWriter so the Reader knows how many bytes to read for the payload
        return cíl.position() - pozice;
    }

//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        HerniUdalost inst = new HerniUdalost();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
